package com.itcast.demo.tokkit;

/**
 * 20:24
 * 面试官
 * 不限语言实现功能，并于一个小时后将代码文件发送到邮箱：arlenyu@tencent.com
 * <p>
 * 1. 打印从1到最大的n位数
 * 输入数字 n，按顺序打印出从 1 最大的 n 位十进制数。比如输入 3，则打印出 1、2、3 一直到最大的 3 位数即 999。
 * <p>
 * 2. 不用加减乘除做加法
 * 写一个函数，求两个整数之和，要求在函数体内不得使用＋、－、×、÷ 四则运算符号。
 * <p>
 * 3. 正则表达式匹配
 * 请实现一个函数用来匹配包括 '.' 和 '*' 的正则表达式。
 * 模式中的字符 '.' 表示任意一个字符，而 '*' 表示它前面的字符可以出现任意次（含 0 次）。
 * 在本题中，匹配是指字符串的所有字符匹配整个模式。
 * 例如，字符串 "aaa" 与模式 "a.a" 和 "ab*ac*a" 匹配，但是与 "aa.a" 和 "ab*a" 均不匹配。
 * 样例：输入：s="aa" p="a*" 输出：true
 *
 * @author eternity
 */
public class DemoTest {
    public static void main(String[] args) {
        DemoTest test = new DemoTest();
        //test.getMaxNum(10000);
        int num = test.addFunc(7, 14);
        System.out.println(num);
    }

    /**
     * 打印从1到最大的n位数
     * 输入数字 n，按顺序打印出从 1 最大的 n 位十进制数。比如输入 3，则打印出 1、2、3 一直到最大的 3 位数即 999
     */
    public void getMaxNum(int num) {
        if (num < 1) {
            return;
        }
        for (int i = 1; i <= num; i++) {
            if (i > 999) {
                break;
            }
            if (i != 999) {
                System.out.print(i + "、");
            } else {
                System.out.println(i);
            }
        }
    }

    /**
     * 不用加减乘除做加法
     * 写一个函数，求两个整数之和，要求在函数体内不得使用＋、－、×、÷ 四则运算符号。
     * 思路：不用加减乘除运算符，则需要采用二进制来进行运算
     * 5 + 8 = 13
     * 0101  1000   1101
     * 7 + 14 = 21     9    6----12
     * 0111  1110   10101   ^1001   &110---0
     *
     * @param a 加数1
     * @param b 加数2
     * @return 两数之和
     */
    public int addFunc(int a, int b) {
        // 当没有进位的时候，采用亦或；
        while (b != 0) {
            int num = a ^ b;
            // 当有进位的时候，循环移位
            b = (a & b) << 1;
            a = num;
        }
        // 有进位12 + 9
        return a;
    }

    /**
     * 正则表达式匹配
     * 请实现一个函数用来匹配包括 '.' 和 '*' 的正则表达式。
     * 模式中的字符 '.' 表示任意一个字符，而 '*' 表示它前面的字符可以出现任意次（含 0 次）。
     * 在本题中，匹配是指字符串的所有字符匹配整个模式。
     * 例如，字符串 "aaa" 与模式 "a.a" 和 "ab*ac*a" 匹配，但是与 "aa.a" 和 "ab*a" 均不匹配。
     * 样例：输入：s="aa" p="a*" 输出：true
     *
     * @param str     字符串
     * @param pattern 匹配序列
     * @return 是否匹配
     */
    public boolean matchString(String str, String pattern) {
        if (str == null || pattern == null) {
            return false;
        }
        boolean flag = false;
        char[] strArr = str.toCharArray();
        char[] patternArr = pattern.toCharArray();
        for (int i = 0; i < patternArr.length; i++) {
            if (patternArr[i] == '*' || patternArr[i] == '.') {
                return true;
            }
            // 判断当前字符的下一字符是否是*或者.
            if (strArr[i] == patternArr[i]) {

            }
        }
        return flag;
    }
}
